package com.wyl.java.juc_.semaphore_;

import java.util.concurrent.Semaphore;

/**
 * 一句话：控制访问有限的共享资源
 *
 * Semaphore是一种计数信号量，用于控制同时访问某个资源或代码段的线程数量。Semaphore内部维护着一个计数器，初始时可以指定该计数器的值。当有一个线程请求获取Semaphore时，Semaphore会将计数器减1，若计数器的值小于0，则该线程会被阻塞，直到有其他线程释放了Semaphore并将计数器加1才能继续执行。
 * <p>
 * Semaphore通常用于对有限资源的访问控制，例如数据库连接池、线程池、限流等场景。Semaphore有两个主要方法：
 * <p>
 * acquire()：获取Semaphore的计数器，如果当前计数器的值为0，则阻塞调用该方法的线程。
 * release()：释放Semaphore的计数器，将其值加1。
 * 另外，Semaphore还有一个构造函数可以设置Semaphore的计数器初始值，也可以选择是否公平地分配Semaphore。
 */
public class Semaphore01 {

    public static void main(String[] args) {
        int permits = 3;
        Semaphore semaphore = new Semaphore(permits, true); // 创建Semaphore实例

        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(() -> {
                try {
                    semaphore.acquire(); // 获取Semaphore的计数器
                    System.out.println(Thread.currentThread().getName() + "获取了Semaphore");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release(); // 释放Semaphore的计数器
                    System.out.println(Thread.currentThread().getName() + "释放了Semaphore");
                }
            }, "Thread-" + i);
            thread.start();
        }
    }
}
